今天要設定平手的情況。
int turns = 0; // 記錄目前總共下了幾步(最大為 9)
接著,在玩家每次點擊成功、成功填入棋子時,將 turns 進行遞增(turns++):
if (tile.getText() == ""){
tile.setText(currentPlayer);
turns++; // 每下一子,回合數 +1
checkWinner(); // 檢查是否有贏家或平手
if (!gameOver){
currentPlayer = currentPlayer == playerX ? playerO : playerX;
textLabel.setText(currentPlayer + "'s turn.");
}
}
// 如果 9 格全滿且沒有人獲勝,判定為平手 (Tie)
if (turns == 9) {
for (int r = 0; r < 3; r++) {
for (int c = 0; c < 3; c++) {
setTie(board[r][c]); // 遍歷所有格子套用平手樣式
}
}
gameOver = true; // 鎖定遊戲
}
void setTie(JButton tile) {
tile.setForeground(Color.orange); // 將平局棋子字體設為橘色
tile.setBackground(Color.gray); // 背景設為灰色高亮
textLabel.setText("Tie!"); // 頂部標題顯示平手
}
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class TicTacToe {
int boardWidth = 600;
int boardHeight = 650; //50px for the text panel on top
JFrame frame = new JFrame("Tic-Tac-Toe");
JLabel textLabel = new JLabel();
JPanel textPanel = new JPanel();
JPanel boardPanel = new JPanel();
JButton[][] board = new JButton[3][3];
String playerX = "X";
String playerO = "O";
String currentPlayer = playerX;
boolean gameOver = false;
int turns = 0;
TicTacToe(){
frame.setVisible(true);
frame.setSize(boardWidth, boardHeight);
frame.setLocationRelativeTo(null);
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
textLabel.setBackground(Color.darkGray);
textLabel.setForeground(Color.white);
textLabel.setFont(new Font("Arial", Font.BOLD, 50));
textLabel.setHorizontalAlignment(JLabel.CENTER);
textLabel.setText("Tic-Tac-Toe");
textLabel.setOpaque(true);
textPanel.setLayout(new BorderLayout());
textPanel.add(textLabel);
frame.add(textPanel, BorderLayout.NORTH);
boardPanel.setLayout(new GridLayout(3, 3));
boardPanel.setBackground(Color.darkGray);
frame.add(boardPanel);
for (int r = 0; r < 3; r++){
for (int c = 0; c < 3; c++){
JButton tile = new JButton();
board[r][c] = tile;
boardPanel.add(tile);
tile.setBackground(Color.darkGray);
tile.setForeground(Color.white);
tile.setFont(new Font("Arial", Font.BOLD, 120));
tile.setFocusable(false);
tile.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){
if (gameOver) return;
JButton tile = (JButton)e.getSource();
if (tile.getText() == ""){
tile.setText(currentPlayer);
turns++;
checkWinner();
if (!gameOver){
currentPlayer = currentPlayer == playerX ? playerO : playerX;
textLabel.setText(currentPlayer + "'s turn.");
}
}
}
});
}
}
}
void checkWinner() {
//horizontal
for (int r = 0; r < 3; r++) {
if (board[r][0].getText() == "") continue;
if (board[r][0].getText() == board[r][1].getText() &&
board[r][1].getText() == board[r][2].getText()){
for (int i = 0; i < 3; i++) {
setWinner(board[r][i]);
}
gameOver = true;
return;
}
}
//vertical
for (int c = 0; c < 3; c++){
if (board[0][c].getText() == "") continue;
if (board[0][c].getText() == board[1][c].getText() &&
board[1][c].getText() == board[2][c].getText()){
for (int i = 0; i < 3; i++){
setWinner(board[i][c]);
}
gameOver = true;
return;
}
}
//diagonally
if (board[0][0].getText() == board[1][1].getText() &&
board[1][1].getText() == board[2][2].getText() &&
board[0][0].getText() != "") {
for (int i = 0; i < 3; i++){
setWinner(board[i][i]);
}
gameOver = true;
return;
}
//anti-diagonally
if (board[0][2].getText() == board[1][1].getText() &&
board[1][1].getText() == board[2][0].getText() &&
board[0][2].getText() != "") {
setWinner(board[0][2]);
setWinner(board[1][1]);
setWinner(board[2][0]);
gameOver = true;
return;
}
if (turns == 9) {
for (int r = 0; r < 3; r++) {
for (int c = 0; c < 3; c++) {
setTie(board[r][c]);
}
}
gameOver = true;
}
}
void setWinner(JButton tile) {
tile.setForeground(Color.green);
tile.setBackground(Color.gray);
textLabel.setText(currentPlayer + " is the winner!");
}
void setTie(JButton tile) {
tile.setForeground(Color.orange);
tile.setBackground(Color.gray);
textLabel.setText("Tie!");
}
}
平手長這樣:
參考教學影片:https://youtu.be/Nc77ymnm8Ss?si=6zTKNG1CXbCS-grI